#include <bits/stdc++.h>
using namespace std;

//小根堆，维持堆大小为k

class Solution {
public:
    struct cmp{
        bool operator()(const pair<int,int> &a, const pair<int,int> &b){
            return a.second>b.second;
        }
    };
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> mp;
        for(auto& num:nums){
            ++mp[num];
        }
        
        priority_queue<pair<int,int>, vector<pair<int,int>>, cmp> pque;
        for(auto& it:mp){
            pque.emplace(it);
            if(pque.size()>k) pque.pop();
        }

        vector<int> ans(k);
        for(int i=k-1; i>-1; --i){
            ans[i] = pque.top().first;
            pque.pop();
        }
        return ans;
    }
};